home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / mm / signal.c.D < prev    next >
Text File  |  1990-07-25  |  9KB  |  290 lines

  1. *** /tmp/,RCSt1022405    Wed Jul 25 13:59:45 1990
  2. --- signal.c    Mon Jul 23 21:37:33 1990
  3. ***************
  4. *** 17,27 ****
  5.   
  6. ! #include "../h/const.h"
  7. ! #include "../h/type.h"
  8. ! #include "../h/callnr.h"
  9. ! #include "../h/com.h"
  10. ! #include "../h/error.h"
  11. ! #include "../h/signal.h"
  12. ! #include "../h/stat.h"
  13. ! #include "const.h"
  14. ! #include "glo.h"
  15.   #include "mproc.h"
  16. --- 17,24 ----
  17.   
  18. ! #include "mm.h"
  19. ! #include <sys/stat.h>
  20. ! #include <signal.h>
  21. ! #include <minix/callnr.h>
  22. ! #include <minix/com.h>
  23.   #include "mproc.h"
  24. ***************
  25. *** 35,36 ****
  26. --- 32,41 ----
  27.   
  28. + #if AM_KERNEL
  29. + PRIVATE int Tfs;        /* if true then Tell file server to unpause */
  30. + #endif
  31. + FORWARD int check_sig();
  32. + FORWARD void dump_core();
  33. + FORWARD void unpause();
  34.   /*===========================================================================*
  35. ***************
  36. *** 44,48 ****
  37.   
  38. !   int mask, oldign;
  39.   
  40. !   if (sig < 1 || sig > NR_SIGS) return(EINVAL);
  41.     if (sig == SIGKILL) return(OK);    /* SIGKILL may not ignored/caught */
  42. --- 49,54 ----
  43.   
  44. !   int mask;
  45. !   int sigign = mp->mp_ignore;
  46.   
  47. !   if (sig < 1 || sig > _NSIG) return(EINVAL);
  48.     if (sig == SIGKILL) return(OK);    /* SIGKILL may not ignored/caught */
  49. ***************
  50. *** 49,51 ****
  51.     mask = 1 << (sig - 1);    /* singleton set with 'sig' bit on */
  52. -   oldign = mp->mp_ignore;
  53.   
  54. --- 55,56 ----
  55. ***************
  56. *** 63,66 ****
  57.     }
  58. !   if (oldign & mask)
  59. !     return(1);
  60.     return(OK);
  61. --- 68,71 ----
  62.     }
  63. !   if (sigign & mask) return(1);
  64.     return(OK);
  65. ***************
  66. *** 93,95 ****
  67.     register struct mproc *rmp;
  68. !   int i, proc_id, proc_nr, id;
  69.     unshort sig_map;        /* bits 0 - 15 for sigs 1 - 16 */
  70. --- 98,100 ----
  71.     register struct mproc *rmp;
  72. !   int i, j, proc_id, proc_nr, id;
  73.     unshort sig_map;        /* bits 0 - 15 for sigs 1 - 16 */
  74. ***************
  75. *** 96,99 ****
  76.   
  77. !   /* Only kernel and FS may make this call. */
  78. !   if (who != HARDWARE && who != FS_PROC_NR) return(EPERM);
  79.   
  80. --- 101,105 ----
  81.   
  82. !   /* Only kernel may make this call. */
  83. !   if (who != HARDWARE) return(EPERM);
  84. !   dont_reply = TRUE;        /* don't reply to the kernel */
  85.   
  86. ***************
  87. *** 108,110 ****
  88.     /* Stack faults are passed from kernel to MM as pseudo-signal 16. */
  89. !   if (sig_map == 1 << (STACK_FAULT - 1))
  90.       stack_fault(proc_nr);
  91. --- 114,116 ----
  92.     /* Stack faults are passed from kernel to MM as pseudo-signal 16. */
  93. !   if (sig_map == 1 << (SIGSTKFLT - 1))
  94.       stack_fault(proc_nr);
  95. ***************
  96. *** 116,121 ****
  97.      */
  98. !   for (i = 0; i < NR_SIGS-1; i++) {
  99. !     id= (i+1 == SIGINT || i+1 == SIGQUIT ? 0 : proc_id);
  100. !     if (i + 1 == SIGKILL) id = -1;    /* simulate kill -1 9 */
  101. !     if ( (sig_map >> i) & 1) check_sig(id, i + 1, SUPER_USER);
  102.     }
  103. --- 122,130 ----
  104.      */
  105. !   for (i = 0, j = 1; i < _NSIG - 1; i++, j++) {
  106. !     id = (j == SIGINT || j == SIGQUIT) ? 0 : proc_id;
  107. !     if (j == SIGKILL) id = -1;    /* simulate kill -1 9 */
  108. !     if ( (sig_map >> i) & 1) {
  109. !         check_sig(id, j, SUPER_USER);
  110. !         sys_sig(proc_nr, -1, SIG_DFL);    /* tell kernel it's done */
  111. !     }
  112.     }
  113. ***************
  114. *** 122,124 ****
  115.   
  116. -   dont_reply = TRUE;        /* don't reply to the kernel */
  117.     return(OK);
  118. --- 131,132 ----
  119. ***************
  120. *** 133,135 ****
  121.   int sig_nr;            /* which signal to send (1-16) */
  122. ! uid send_uid;            /* identity of process sending the signal */
  123.   {
  124. --- 141,143 ----
  125.   int sig_nr;            /* which signal to send (1-16) */
  126. ! uid_t send_uid;            /* identity of process sending the signal */
  127.   {
  128. ***************
  129. *** 143,147 ****
  130.     unshort mask;
  131. -   extern unshort core_bits;
  132.   
  133. !   if (sig_nr < 1 || sig_nr > NR_SIGS) return(EINVAL);
  134.     count = 0;            /* count # of signals sent */
  135. --- 151,154 ----
  136.     unshort mask;
  137.   
  138. !   if (sig_nr < 1 || sig_nr > _NSIG) return(EINVAL);
  139.     count = 0;            /* count # of signals sent */
  140. ***************
  141. *** 155,159 ****
  142.      */
  143. !   for (rmp = &mproc[INIT_PROC_NR + 1]; rmp < &mproc[NR_PROCS]; rmp++ ) {
  144.       if ( (rmp->mp_flags & IN_USE) == 0) continue;
  145. !     send_sig = TRUE;    /* if it's FALSE at end of loop, don't signal */
  146.       if (send_uid != rmp->mp_effuid && send_uid != SUPER_USER)send_sig=FALSE;
  147. --- 162,166 ----
  148.      */
  149. !   for (rmp = &mproc[INIT_PROC_NR]; rmp < &mproc[NR_PROCS]; rmp++ ) {
  150.       if ( (rmp->mp_flags & IN_USE) == 0) continue;
  151. !     send_sig = TRUE;    /* if it's FALSE at end of loop, don't signal*/
  152.       if (send_uid != rmp->mp_effuid && send_uid != SUPER_USER)send_sig=FALSE;
  153. ***************
  154. *** 161,164 ****
  155.       if (rmp->mp_flags & HANGING) send_sig = FALSE;   /*don't wake the dead*/
  156. !     if (proc_id == 0 && mp->mp_procgrp != rmp->mp_procgrp) send_sig = FALSE;
  157.       if (send_uid == SUPER_USER && proc_id == -1) send_sig = TRUE;
  158.   
  159. --- 168,173 ----
  160.       if (rmp->mp_flags & HANGING) send_sig = FALSE;   /*don't wake the dead*/
  161. !     if (proc_id == 0 && mp->mp_procgrp != rmp->mp_procgrp)send_sig = FALSE;
  162.       if (send_uid == SUPER_USER && proc_id == -1) send_sig = TRUE;
  163. +     if (rmp->mp_pid == INIT_PID && proc_id == -1) send_sig = FALSE;
  164. +     if (rmp->mp_pid == INIT_PID && sig_nr == SIGKILL) send_sig = FALSE;
  165.   
  166. ***************
  167. *** 177,178 ****
  168. --- 186,192 ----
  169.   
  170. + #if AM_KERNEL
  171. +     /* see if an amoeba transaction should be signalled */
  172. +     Tfs = am_check_sig((int)(rmp - mproc), 0);
  173. + #endif
  174.       /* Send the signal or kill the process, possibly with core dump. */
  175. ***************
  176. *** 186,188 ****
  177.     /* If the calling process has killed itself, don't reply. */
  178. !   if ((mp->mp_flags & IN_USE) == 0 || (mp->mp_flags & HANGING))dont_reply =TRUE;
  179.     return(count > 0 ? OK : ESRCH);
  180. --- 200,202 ----
  181.     /* If the calling process has killed itself, don't reply. */
  182. !   if ((mp->mp_flags & IN_USE) == 0 || (mp->mp_flags & HANGING))dont_reply=TRUE;
  183.     return(count > 0 ? OK : ESRCH);
  184. ***************
  185. *** 194,196 ****
  186.    *===========================================================================*/
  187. ! PUBLIC sig_proc(rmp, sig_nr)
  188.   register struct mproc *rmp;    /* pointer to the process to be signaled */
  189. --- 208,210 ----
  190.    *===========================================================================*/
  191. ! PUBLIC void sig_proc(rmp, sig_nr)
  192.   register struct mproc *rmp;    /* pointer to the process to be signaled */
  193. ***************
  194. *** 207,209 ****
  195.     vir_bytes new_sp;
  196. -   extern unshort core_bits;
  197.   
  198. --- 221,222 ----
  199. ***************
  200. *** 210,211 ****
  201. --- 223,229 ----
  202.     if ( (rmp->mp_flags & IN_USE) == 0) return;    /* if already dead forget it */
  203. +   if (rmp->mp_flags & TRACED && sig_nr != SIGKILL) {
  204. +     /* A traced process has special handling. */
  205. +     stop_proc(rmp, sig_nr); /* a signal causes it to stop */
  206. +     return;
  207. +   }
  208.     mask = 1 << (sig_nr - 1);
  209. ***************
  210. *** 290,292 ****
  211.    *===========================================================================*/
  212. ! PUBLIC unpause(pro)
  213.   int pro;            /* which process number */
  214. --- 308,310 ----
  215.    *===========================================================================*/
  216. ! PRIVATE void unpause(pro)
  217.   int pro;            /* which process number */
  218. ***************
  219. *** 313,315 ****
  220.     if ( (rmp->mp_flags & WAITING) && (rmp->mp_flags & HANGING) == 0) {
  221. !     rmp->mp_flags &= ~ WAITING;    /* turn off WAITING bit */
  222.       reply(pro, EINTR, 0, NIL_PTR);
  223. --- 331,333 ----
  224.     if ( (rmp->mp_flags & WAITING) && (rmp->mp_flags & HANGING) == 0) {
  225. !     rmp->mp_flags &= ~WAITING;    /* turn off WAITING bit */
  226.       reply(pro, EINTR, 0, NIL_PTR);
  227. ***************
  228. *** 318,321 ****
  229.   
  230.     /* Process is not hanging on an MM call.  Ask FS to take a look. */
  231. !   tell_fs(UNPAUSE, pro, 0, 0);
  232.   
  233. --- 336,343 ----
  234.   
  235. + #if AM_KERNEL
  236. +   /* if it was an amoeba transaction, it is already tidied up by now. */
  237. +   if (Tfs)
  238. + #endif
  239.     /* Process is not hanging on an MM call.  Ask FS to take a look. */
  240. !     tell_fs(UNPAUSE, pro, 0, 0);
  241.   
  242. ***************
  243. *** 328,330 ****
  244.    *===========================================================================*/
  245. ! PRIVATE dump_core(rmp)
  246.   register struct mproc *rmp;    /* whose core is to be dumped */
  247. --- 350,352 ----
  248.    *===========================================================================*/
  249. ! PRIVATE void dump_core(rmp)
  250.   register struct mproc *rmp;    /* whose core is to be dumped */
  251. ***************
  252. *** 339,343 ****
  253.     struct mproc *xmp;
  254. !   extern char core_name[];
  255.   
  256.     /* Change to working directory of dumpee. */
  257. --- 361,365 ----
  258.     stru